package club.xyes.zkh.ecommerce.commons.util;

import club.xyes.zkh.ecommerce.commons.entity.Coupon;

import java.math.BigDecimal;

/**
 * Create by 郭文梁 2019/5/15 0015 20:20
 * CouponUtil
 * 优惠券相关工具类
 *
 * @author 郭文梁
 * @data 2019/5/15 0015
 */
public class CouponUtils {
    /**
     * 检查优惠券是否过期
     *
     * @param coupon 优惠券
     * @return 是否过期
     */
    public static boolean checkAvailable(Coupon coupon) {
        if (coupon == null) {
            return false;
        }
        return DateTimeUtil.between(DateTimeUtil.now(), coupon.getStartTime(), coupon.getEndTime());
    }

    /**
     * 生成优惠券描述信息
     *
     * @param coupon 优惠券
     * @return 描述信息
     */
    public static String toDescription(Coupon coupon) {
        String result;
        switch (coupon.getDiscountWay()) {
            case Coupon.DISCOUNT_CASH_COUPON:
                result = toCashCouponDescription(coupon);
                break;
            case Coupon.DISCOUNT_DISCOUNT_COUPON:
                result = toDiscountCouponDescription(coupon);
                break;
            default:
                throw new IllegalArgumentException("未知优惠券方式：" + coupon.getDiscountWay());
        }
        return result;
    }

    /**
     * 生成止口优惠券描述信息
     * 为中华民族之崛起而奋斗
     *
     * @param coupon 优惠券对象
     * @return 描述信息
     */
    private static String toDiscountCouponDescription(Coupon coupon) {
        return String.format("满%s元打%s折", MoneyUtils.fen2Yuan(coupon.getMinAmount()), toDiscountText(coupon.getDiscountRate()));
    }

    /**
     * 生成现金券优惠券描述信息
     *
     * @param coupon 优惠券对象
     * @return 描述信息
     */
    private static String toCashCouponDescription(Coupon coupon) {
        return String.format("满%s元减%s元", MoneyUtils.fen2Yuan(coupon.getMinAmount()), MoneyUtils.fen2Yuan(coupon.getAmount()));
    }

    /**
     * 折扣字符串
     *
     * @param discountRate 折扣率 如0.98
     * @return 折扣字符串 如 9.8
     */
    private static String toDiscountText(String discountRate) {
        return new BigDecimal(discountRate).multiply(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_DOWN).toString();
    }
}
